package com.dl698.parse;

import com.dl698.axdr.*;
import com.dl698.bean.FrameData;
import com.dl698.util.DataUtils;
import java.util.*;

/**
 * ParseTools类
 * 实现数据解析工具
 * 
 * @author wind
 * @version 1.1.1
 */
public class ParseTools {

    public static String parseData(Data data) {
        Map<String, Object> map = new HashMap<>();
        Object frameData = null;

        switch (data.getChoice().getValue()) {
            case 0:
                map.put(FrameData.dataKey.null_data.toString(), "");
                frameData = convertTSMapToJSObj(map);
                break;
            case 1:
                data.getArray().encodeAndSave(1000);
                List<String> list_array = new ArrayList<>();
                for (int i = 0; i < data.getArray().size(); i++) {
                    list_array.add(parseData(data.getArray().get(i)));
                }
                map.put(FrameData.dataKey.array.toString(), list_array);
                frameData = convertTSMapToJSObj(map);
                break;
            case 2:
                data.getStructure().encodeAndSave(1000);
                List<String> list_structure = new ArrayList<>();
                for (int i = 0; i < data.getStructure().size(); i++) {
                    list_structure.add(parseData(data.getStructure().get(i)));
                }
                map.put(FrameData.dataKey.structure.toString(), list_structure);
                frameData = convertTSMapToJSObj(map);
                break;
            case 3:
                data.getBool().encodeAndSave(1000);
                map.put(FrameData.dataKey.bool.toString(),
                        DataUtils.bytesToHexString(data.getBool().getDataCode(), 0,
                                data.getBool().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 4:
                map.put(FrameData.dataKey.bit_string.toString(), data.getBitString().toString());
                frameData = convertTSMapToJSObj(map);
                break;
            case 5:
                data.getDoubleLong().encodeAndSave(1000);
                map.put(FrameData.dataKey.double_long.toString(),
                        DataUtils.bytesToHexString(data.getDoubleLong().getDataCode(), 0,
                                data.getDoubleLong().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 6:
                data.getDoubleLongUnsigned().encodeAndSave(1000);
                map.put(FrameData.dataKey.double_long_unsigned.toString(),
                        DataUtils.bytesToHexString(data.getDoubleLongUnsigned().getDataCode(), 0,
                                data.getDoubleLongUnsigned().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 9:
                map.put(FrameData.dataKey.octet_string.toString(), data.getOctetString().toString());
                frameData = convertTSMapToJSObj(map);
                break;
            case 10:
                map.put(FrameData.dataKey.visible_string.toString(), data.getVisibleString().toString());
                frameData = convertTSMapToJSObj(map);
                break;
            case 12:
                map.put(FrameData.dataKey.utf8_string.toString(), data.getUtf8String().toString());
                frameData = convertTSMapToJSObj(map);
                break;
            case 15:
                data.getInteger().encodeAndSave(1000);
                map.put(FrameData.dataKey.integer.toString(),
                        DataUtils.bytesToHexString(data.getInteger().getDataCode(), 0,
                                data.getInteger().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 16:
                data.getLongData().encodeAndSave(1000);
                map.put(FrameData.dataKey.long_key.toString(),
                        DataUtils.bytesToHexString(data.getLongData().getDataCode(), 0,
                                data.getLongData().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 17:
                data.getUnsigned().encodeAndSave(1000);
                map.put(FrameData.dataKey.unsigned.toString(),
                        DataUtils.bytesToHexString(data.getUnsigned().getDataCode(), 0,
                                data.getUnsigned().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 18:
                data.getLongUnsigned().encodeAndSave(1000);
                map.put(FrameData.dataKey.long_unsigned.toString(),
                        DataUtils.bytesToHexString(data.getLongUnsigned().getDataCode(), 0,
                                data.getLongUnsigned().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 20:
                data.getLong64().encodeAndSave(1000);
                map.put(FrameData.dataKey.long64.toString(),
                        DataUtils.bytesToHexString(data.getLong64().getDataCode(), 0,
                                data.getLong64().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 21:
                data.getLong64Unsigned().encodeAndSave(1000);
                map.put(FrameData.dataKey.long64_unsigned.toString(),
                        DataUtils.bytesToHexString(data.getLong64Unsigned().getDataCode(), 0,
                                data.getLong64Unsigned().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 22:
                data.getEnumData().encodeAndSave(1000);
                map.put(FrameData.dataKey.enum_key.toString(),
                        DataUtils.bytesToHexString(data.getEnumData().getDataCode(), 0,
                                data.getEnumData().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 23:
                map.put(FrameData.dataKey.float32.toString(), data.getFloat32().toString());
                frameData = convertTSMapToJSObj(map);
                break;
            case 24:
                map.put(FrameData.dataKey.float64.toString(), data.getFloat64().toString());
                frameData = convertTSMapToJSObj(map);
                break;
            case 25:
                data.getDateTime().encodeAndSave(1000);
                map.put(FrameData.dataKey.date_time.toString(),
                        DataUtils.bytesToHexString(data.getDateTime().getDataCode(), 0,
                                data.getDateTime().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 26:
                data.getDate().encodeAndSave(1000);
                map.put(FrameData.dataKey.date.toString(),
                        DataUtils.bytesToHexString(data.getDate().getDataCode(), 0,
                                data.getDate().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 27:
                data.getTime().encodeAndSave(1000);
                map.put(FrameData.dataKey.time.toString(),
                        DataUtils.bytesToHexString(data.getTime().getDataCode(), 0,
                                data.getTime().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 28:
                data.getDateTimeS().encodeAndSave(1000);
                map.put(FrameData.dataKey.date_time_s.toString(),
                        DataUtils.bytesToHexString(data.getDateTimeS().getDataCode(), 0,
                                data.getDateTimeS().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 80:
                data.getOi().encodeAndSave(1000);
                map.put(FrameData.dataKey.oi.toString(),
                        DataUtils.bytesToHexString(data.getOi().getDataCode(), 0, data.getOi().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 81:
                data.getOad().encodeAndSave(1000);
                map.put(FrameData.dataKey.oad.toString(),
                        DataUtils.bytesToHexString(data.getOad().getDataCode(), 0, data.getOad().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 82:
                try {
                    data.getRoad().encodeAndSave(1000);
                } catch (java.io.IOException e) {
                    throw new RuntimeException(e);
                }
                Map<String, Object> road_data = new HashMap<>();
                List<String> seq_oad = new ArrayList<>();
                for (int i = 0; i < data.getRoad().getOads().size(); i++) {
                    Data value = new Data();
                    value.setOad(data.getRoad().getOads().get(i));
                    seq_oad.add(parseData(value));
                }
                data.getRoad().getOad().encodeAndSave(1000);
                road_data.put("OAD", DataUtils.bytesToHexString(data.getRoad().getOad().getDataCode(), 0,
                        data.getRoad().getOad().getDataCode().length));
                road_data.put("seq_oad", seq_oad);
                map.put(FrameData.dataKey.road.toString(), road_data);
                frameData = convertTSMapToJSObj(map);
                break;
            case 83:
                data.getOmd().encodeAndSave(1000);
                map.put(FrameData.dataKey.omd.toString(),
                        DataUtils.bytesToHexString(data.getOmd().getDataCode(), 0, data.getOmd().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 84:
                data.getTi().encodeAndSave(1000);
                data.getTi().getUnit().encodeAndSave(1000);
                data.getTi().getInter().encodeAndSave(1000);
                Map<String, Object> ti_data = new HashMap<>();
                ti_data.put("enum", DataUtils.bytesToHexString(data.getTi().getUnit().getDataCode(), 0,
                        data.getTi().getUnit().getDataCode().length));
                ti_data.put("long_unsigned", DataUtils.bytesToHexString(data.getTi().getInter().getDataCode(), 0,
                        data.getTi().getInter().getDataCode().length));
                map.put(FrameData.dataKey.ti.toString(), ti_data);
                frameData = convertTSMapToJSObj(map);
                break;
            case 85:
                map.put(FrameData.dataKey.tsa.toString(), data.getTsa().toString());
                frameData = convertTSMapToJSObj(map);
                break;
            case 86:
                map.put(FrameData.dataKey.mac.toString(), data.getMac().toString());
                frameData = convertTSMapToJSObj(map);
                break;
            case 87:
                map.put(FrameData.dataKey.rn.toString(), data.getRn().toString());
                frameData = convertTSMapToJSObj(map);
                break;
            case 88:
                data.getRegion().encodeAndSave(1000);
                Map<String, Object> region_data = new HashMap<>();
                Data regionType = new Data();
                com.dl698.asn1.axdr.AxdrEnum enum_data = new com.dl698.asn1.axdr.AxdrEnum();
                data.getRegion().getUnit().encodeAndSave(1000);
                enum_data.setDataCode(data.getRegion().getUnit().getDataCode());
                regionType.setEnumData(enum_data);
                region_data.put("type", parseData(regionType));
                region_data.put("s_data", parseData(data.getRegion().getSval()));
                region_data.put("e_data", parseData(data.getRegion().getEval()));
                map.put(FrameData.dataKey.region.toString(), region_data);
                frameData = convertTSMapToJSObj(map);
                break;
            case 89:
                data.getScalerUnit().encodeAndSave(1000);
                map.put(FrameData.dataKey.scaler_unit.toString(),
                        DataUtils.bytesToHexString(data.getScalerUnit().getDataCode(), 0,
                                data.getScalerUnit().getDataCode().length));
                frameData = convertTSMapToJSObj(map);
                break;
            case 90:
                data.getRsd().encodeAndSave(1000);
                Object rsdTempData = null;
                switch (data.getRsd().getChoice().getValue()) {
                    case 0:
                        Map<String, Object> selector0 = new HashMap<>();
                        rsdTempData = selector0;
                        break;
                    case 1:
                        data.getRsd().getS1().encodeAndSave(1000);
                        Map<String, Object> selector1 = new HashMap<>();
                        data.getRsd().getS1().getOad().encodeAndSave(1000);
                        data.getRsd().getS1().getData().encodeAndSave(1000);
                        selector1.put("OAD", DataUtils.bytesToHexString(data.getRsd().getS1().getOad().getDataCode(), 0,
                                data.getRsd().getS1().getOad().getDataCode().length));
                        selector1.put("data", parseData(data.getRsd().getS1().getData()));
                        rsdTempData = selector1;
                        break;
                    case 2:
                        data.getRsd().getS2().encodeAndSave(1000);
                        Map<String, Object> selector2 = new HashMap<>();
                        data.getRsd().getS2().getOad().encodeAndSave(1000);
                        data.getRsd().getS2().getSval().encodeAndSave(1000);
                        data.getRsd().getS2().getEval().encodeAndSave(1000);
                        data.getRsd().getS2().getInter().encodeAndSave(1000);
                        selector2.put("OAD", DataUtils.bytesToHexString(data.getRsd().getS2().getOad().getDataCode(), 0,
                                data.getRsd().getS2().getOad().getDataCode().length));
                        selector2.put("s_data", parseData(data.getRsd().getS2().getSval()));
                        selector2.put("e_data", parseData(data.getRsd().getS2().getEval()));
                        selector2.put("unit", parseData(data.getRsd().getS2().getInter()));
                        rsdTempData = selector2;
                        break;
                    case 3:
                        data.getRsd().getS3().encodeAndSave(1000);
                        List<Map<String, Object>> s3_list = new ArrayList<>();
                        Map<String, Object> selector3 = new HashMap<>();
                        for (int i = 0; i < data.getRsd().getS3().size(); i++) {
                            Map<String, Object> selector2_map = new HashMap<>();
                            data.getRsd().getS3().get(i).getOad().encodeAndSave(1000);
                            data.getRsd().getS3().get(i).getSval().encodeAndSave(1000);
                            data.getRsd().getS3().get(i).getEval().encodeAndSave(1000);
                            data.getRsd().getS3().get(i).getInter().encodeAndSave(1000);
                            selector2_map.put("OAD",
                                    DataUtils.bytesToHexString(data.getRsd().getS3().get(i).getOad().getDataCode(), 0,
                                            data.getRsd().getS3().get(i).getOad().getDataCode().length));
                            selector2_map.put("s_data", parseData(data.getRsd().getS3().get(i).getSval()));
                            selector2_map.put("e_data", parseData(data.getRsd().getS3().get(i).getEval()));
                            selector2_map.put("unit", parseData(data.getRsd().getS3().get(i).getInter()));
                            s3_list.add(selector2_map);
                        }
                        selector3.put("seq_selector2", s3_list);
                        rsdTempData = selector3;
                        break;
                    case 4:
                        data.getRsd().getS4().encodeAndSave(1000);
                        Map<String, Object> selector4 = new HashMap<>();
                        data.getRsd().getS4().getDts().encodeAndSave(1000);
                        data.getRsd().getS4().getMs().encodeAndSave(1000);
                        selector4.put("date_time_s",
                                DataUtils.bytesToHexString(data.getRsd().getS4().getDts().getDataCode(), 0,
                                        data.getRsd().getS4().getDts().getDataCode().length));
                        Data s4_data_ms = new Data();
                        s4_data_ms.setMs(data.getRsd().getS4().getMs());
                        selector4.put("MS", parseMsData(data.getRsd().getS4().getMs()));
                        rsdTempData = selector4;
                        break;
                    case 5:
                        data.getRsd().getS5().encodeAndSave(1000);
                        Map<String, Object> selector5 = new HashMap<>();
                        data.getRsd().getS5().getDts().encodeAndSave(1000);
                        data.getRsd().getS5().getMs().encodeAndSave(1000);
                        selector5.put("date_time_s",
                                DataUtils.bytesToHexString(data.getRsd().getS5().getDts().getDataCode(), 0,
                                        data.getRsd().getS5().getDts().getDataCode().length));
                        selector5.put("ms", parseMsData(data.getRsd().getS5().getMs()));
                        rsdTempData = selector5;
                        break;
                    case 6:
                        data.getRsd().getS6().encodeAndSave(1000);
                        Map<String, Object> selector6 = new HashMap<>();
                        data.getRsd().getS6().getDtss().encodeAndSave(1000);
                        data.getRsd().getS6().getDtse().encodeAndSave(1000);
                        data.getRsd().getS6().getInter().encodeAndSave(1000);
                        data.getRsd().getS6().getMs().encodeAndSave(1000);
                        Data s6_inter = new Data();
                        s6_inter.setTi(data.getRsd().getS6().getInter());
                        selector6.put("s_time",
                                DataUtils.bytesToHexString(data.getRsd().getS6().getDtss().getDataCode(), 0,
                                        data.getRsd().getS6().getDtss().getDataCode().length));
                        selector6.put("e_time",
                                DataUtils.bytesToHexString(data.getRsd().getS6().getDtse().getDataCode(), 0,
                                        data.getRsd().getS6().getDtse().getDataCode().length));
                        selector6.put("ti", parseTIData(data.getRsd().getS6().getInter()));
                        selector6.put("ms", parseMsData(data.getRsd().getS6().getMs()));
                        rsdTempData = selector6;
                        break;
                    case 7:
                        data.getRsd().getS7().encodeAndSave(1000);
                        Map<String, Object> selector7 = new HashMap<>();
                        data.getRsd().getS7().getDtss().encodeAndSave(1000);
                        data.getRsd().getS7().getDtse().encodeAndSave(1000);
                        data.getRsd().getS7().getInter().encodeAndSave(1000);
                        data.getRsd().getS7().getMs().encodeAndSave(1000);
                        selector7.put("s_time",
                                DataUtils.bytesToHexString(data.getRsd().getS7().getDtss().getDataCode(), 0,
                                        data.getRsd().getS7().getDtss().getDataCode().length));
                        selector7.put("e_time",
                                DataUtils.bytesToHexString(data.getRsd().getS7().getDtse().getDataCode(), 0,
                                        data.getRsd().getS7().getDtse().getDataCode().length));
                        selector7.put("ti", parseTIData(data.getRsd().getS7().getInter()));
                        selector7.put("ms", parseMsData(data.getRsd().getS7().getMs()));
                        rsdTempData = selector7;
                        break;
                    case 8:
                        data.getRsd().getS8().encodeAndSave(1000);
                        Map<String, Object> selector8 = new HashMap<>();
                        data.getRsd().getS8().getDtss().encodeAndSave(1000);
                        data.getRsd().getS8().getDtse().encodeAndSave(1000);
                        data.getRsd().getS8().getInter().encodeAndSave(1000);
                        data.getRsd().getS8().getMs().encodeAndSave(1000);
                        selector8.put("s_time",
                                DataUtils.bytesToHexString(data.getRsd().getS8().getDtss().getDataCode(), 0,
                                        data.getRsd().getS8().getDtss().getDataCode().length));
                        selector8.put("e_time",
                                DataUtils.bytesToHexString(data.getRsd().getS8().getDtse().getDataCode(), 0,
                                        data.getRsd().getS8().getDtse().getDataCode().length));
                        selector8.put("ti", parseTIData(data.getRsd().getS8().getInter()));
                        selector8.put("ms", parseMsData(data.getRsd().getS8().getMs()));
                        rsdTempData = selector8;
                        break;
                    case 9:
                        data.getRsd().getS9().encodeAndSave(1000);
                        data.getRsd().getS9().getRecn().encodeAndSave(1000);
                        Map<String, Object> selector9 = new HashMap<>();
                        selector9.put("n_times",
                                DataUtils.bytesToHexString(data.getRsd().getS9().getRecn().getDataCode(), 0,
                                        data.getRsd().getS9().getRecn().getDataCode().length));
                        rsdTempData = selector9;
                        break;
                    case 10:
                        data.getRsd().getS10().encodeAndSave(1000);
                        data.getRsd().getS10().getMs().encodeAndSave(1000);
                        data.getRsd().getS10().getRecn().encodeAndSave(1000);
                        Map<String, Object> selector10 = new HashMap<>();
                        selector10.put("n_times",
                                DataUtils.bytesToHexString(data.getRsd().getS10().getRecn().getDataCode(), 0,
                                        data.getRsd().getS10().getRecn().getDataCode().length));
                        selector10.put("ms", parseMsData(data.getRsd().getS10().getMs()));
                        rsdTempData = selector10;
                        break;
                }
                map.put(FrameData.dataKey.rsd.toString(), rsdTempData);
                frameData = convertTSMapToJSObj(map);
                break;
            case 91:
                data.getCsd().encodeAndSave(1000);
                Object tempData = null;
                switch (data.getCsd().getChoice().getValue()) {
                    case 0:
                        Data csdOadData = new Data();
                        csdOadData.setOad(data.getCsd().getOad());
                        tempData = parseData(csdOadData);
                        break;
                    case 1:
                        Data csdRoadData = new Data();
                        csdRoadData.setRoad(data.getCsd().getRoad());
                        tempData = parseData(csdRoadData);
                        break;
                }
                map.put(FrameData.dataKey.csd.toString(), tempData);
                frameData = convertTSMapToJSObj(map);
                break;
            case 92:
                data.getMs().encodeAndSave(1000);
                Object msData = null;
                switch (data.getMs().getChoice().getValue()) {
                    case 0:
                    case 1:
                        msData = "";
                        break;
                    case 2:
                        Map<String, Object> seqOfU = new HashMap<>();
                        List<String> ms2_list = new ArrayList<>();
                        for (int i = 0; i < data.getMs().getGroupmtype().size(); i++) {
                            Data un8 = new Data();
                            // 修复：正确处理Unsigned8类型，进行类型转换
                            Unsigned8 unsigned8 = data.getMs().getGroupmtype().get(i);
                            AxdrUnsigned8 axdrUnsigned8 = new AxdrUnsigned8();
                            axdrUnsigned8.setValue((short) unsigned8.getValue());
                            un8.setUnsigned(axdrUnsigned8);
                            ms2_list.add(parseData(un8));
                        }
                        seqOfU.put("seq_unsigned", ms2_list);
                        msData = seqOfU;
                        break;
                    case 3:
                        Map<String, Object> seqOfTsa = new HashMap<>();
                        List<String> m3_list = new ArrayList<>();
                        for (int i = 0; i < data.getMs().getGroupmaddr().size(); i++) {
                            Data tsa = new Data();
                            tsa.setTsa(data.getMs().getGroupmaddr().get(i));
                            m3_list.add(parseData(tsa));
                        }
                        seqOfTsa.put("seq_tsa", m3_list);
                        msData = seqOfTsa;
                        break;
                    case 4:
                        Map<String, Object> seqOfLu = new HashMap<>();
                        List<String> m4_list = new ArrayList<>();
                        for (int i = 0; i < data.getMs().getGroupsetindex().size(); i++) {
                            Data lu = new Data();
                            // 修复：正确处理Unsigned16类型，进行类型转换
                            Unsigned16 unsigned16 = data.getMs().getGroupsetindex().get(i);
                            AxdrUnsigned16 axdrUnsigned16 = new AxdrUnsigned16();
                            axdrUnsigned16.setValue((int) unsigned16.getValue());
                            lu.setLongUnsigned(axdrUnsigned16);
                            m4_list.add(parseData(lu));
                        }
                        seqOfLu.put("seq_long_unsigned", m4_list);
                        msData = seqOfLu;
                        break;
                    case 5:
                        Map<String, Object> seqOfR5 = new HashMap<>();
                        List<String> m5_list = new ArrayList<>();
                        for (int i = 0; i < data.getMs().getRegiontype().size(); i++) {
                            Data region = new Data();
                            region.setRegion(data.getMs().getRegiontype().get(i));
                            m5_list.add(parseData(region));
                        }
                        seqOfR5.put("seq_region", m5_list);
                        msData = seqOfR5;
                        break;
                    case 6:
                        Map<String, Object> seqOfR6 = new HashMap<>();
                        List<String> m6_list = new ArrayList<>();
                        for (int i = 0; i < data.getMs().getRegionaddr().size(); i++) {
                            Data region = new Data();
                            region.setRegion(data.getMs().getRegionaddr().get(i));
                            m6_list.add(parseData(region));
                        }
                        seqOfR6.put("seq_region", m6_list);
                        msData = seqOfR6;
                        break;
                    case 7:
                        Map<String, Object> seqOfR7 = new HashMap<>();
                        List<String> m7_list = new ArrayList<>();
                        for (int i = 0; i < data.getMs().getRegionsetindex().size(); i++) {
                            Data region = new Data();
                            region.setRegion(data.getMs().getRegionsetindex().get(i));
                            m7_list.add(parseData(region));
                        }
                        seqOfR7.put("seq_region", m7_list);
                        msData = seqOfR7;
                        break;
                }
                map.put(FrameData.dataKey.ms.toString(), msData);
                frameData = convertTSMapToJSObj(map);
                break;
            case 93:
                data.getSid().encodeAndSave(1000);
                data.getSid().getIndi().encodeAndSave(1000);
                Map<String, Object> sid_data = new HashMap<>();
                sid_data.put("double_long_unsigned", DataUtils.bytesToHexString(data.getSid().getIndi().getDataCode(),
                        0, data.getSid().getIndi().getDataCode().length));
                sid_data.put("octet_string", data.getSid().getFdata().toString());
                map.put(FrameData.dataKey.sid.toString(), sid_data);
                frameData = convertTSMapToJSObj(map);
                break;
            case 94:
                data.getSidMac().encodeAndSave(1000);
                data.getSidMac().getSid().encodeAndSave(1000);
                data.getSidMac().getSid().getIndi().encodeAndSave(1000);
                Map<String, Object> sid_mac_data = new HashMap<>();
                Map<String, Object> sid_map = new HashMap<>();
                sid_map.put("double_long_unsigned",
                        DataUtils.bytesToHexString(data.getSidMac().getSid().getIndi().getDataCode(), 0,
                                data.getSidMac().getSid().getIndi().getDataCode().length));
                sid_map.put("octet_string", data.getSidMac().getSid().getFdata().toString());
                sid_mac_data.put("sid", sid_map);
                sid_mac_data.put("mac", data.getSidMac().getMac().toString());
                map.put(FrameData.dataKey.sid_mac.toString(), sid_mac_data);
                frameData = convertTSMapToJSObj(map);
                break;
            case 95:
                data.getComdcb().encodeAndSave(1000);
                data.getComdcb().getBaut().encodeAndSave(1000);
                data.getComdcb().getParity().encodeAndSave(1000);
                data.getComdcb().getDatab().encodeAndSave(1000);
                data.getComdcb().getStopb().encodeAndSave(1000);
                data.getComdcb().getFlow().encodeAndSave(1000);
                Map<String, Object> comdcb_data = new HashMap<>();
                comdcb_data.put("baut", DataUtils.bytesToHexString(data.getComdcb().getBaut().getDataCode(), 0,
                        data.getComdcb().getBaut().getDataCode().length));
                comdcb_data.put("parity", DataUtils.bytesToHexString(data.getComdcb().getParity().getDataCode(), 0,
                        data.getComdcb().getParity().getDataCode().length));
                comdcb_data.put("datab", DataUtils.bytesToHexString(data.getComdcb().getDatab().getDataCode(), 0,
                        data.getComdcb().getDatab().getDataCode().length));
                comdcb_data.put("stopb", DataUtils.bytesToHexString(data.getComdcb().getStopb().getDataCode(), 0,
                        data.getComdcb().getStopb().getDataCode().length));
                comdcb_data.put("flow", DataUtils.bytesToHexString(data.getComdcb().getFlow().getDataCode(), 0,
                        data.getComdcb().getFlow().getDataCode().length));
                map.put(FrameData.dataKey.comdcb.toString(), comdcb_data);
                frameData = convertTSMapToJSObj(map);
                break;
            case 96:
                data.getRcsd().encodeAndSave(1000);
                List<Object> csd_list = new ArrayList<>();
                Map<String, Object> rcsd_data = new HashMap<>();
                for (int i = 0; i < data.getRcsd().size(); i++) {
                    Object tempData2 = null;
                    switch (data.getRcsd().get(i).getChoice().getValue()) {
                        case 0:
                            Data csdOadData = new Data();
                            csdOadData.setOad(data.getRcsd().get(i).getOad());
                            tempData2 = parseData(csdOadData);
                            break;
                        case 1:
                            Data csdRoadData = new Data();
                            csdRoadData.setRoad(data.getRcsd().get(i).getRoad());
                            tempData2 = parseData(csdRoadData);
                            break;
                    }
                    csd_list.add(tempData2);
                }
                rcsd_data.put("seq_csd", csd_list);
                map.put(FrameData.dataKey.rcsd.toString(), rcsd_data);
                frameData = convertTSMapToJSObj(map);
                break;
        }
        return frameData != null ? frameData.toString() : "";
    }

    public static Map<String, Object> parseTIData(TI ti) {
        ti.getUnit().encodeAndSave(1000);
        ti.getInter().encodeAndSave(1000);
        Map<String, Object> ti_data = new HashMap<>();
        ti_data.put("enum",
                DataUtils.bytesToHexString(ti.getUnit().getDataCode(), 0, ti.getUnit().getDataCode().length));
        ti_data.put("long_unsigned",
                DataUtils.bytesToHexString(ti.getInter().getDataCode(), 0, ti.getInter().getDataCode().length));
        return ti_data;
    }

    public static Object parseMsData(MS ms) {
        Object msData = null;
        switch (ms.getChoice().getValue()) {
            case 0:
            case 1:
                msData = "";
                break;
            case 2:
                Map<String, Object> seqOfU = new HashMap<>();
                List<String> ms2_list = new ArrayList<>();
                for (int i = 0; i < ms.getGroupmtype().size(); i++) {
                    Data un8 = new Data();
                    // 修复：正确处理Unsigned8类型，进行类型转换
                    Unsigned8 unsigned8 = ms.getGroupmtype().get(i);
                    AxdrUnsigned8 axdrUnsigned8 = new AxdrUnsigned8();
                    axdrUnsigned8.setValue((short) unsigned8.getValue());
                    un8.setUnsigned(axdrUnsigned8);
                    ms2_list.add(parseData(un8));
                }
                seqOfU.put("seq_unsigned", ms2_list);
                msData = seqOfU;
                break;
            case 3:
                Map<String, Object> seqOfTsa = new HashMap<>();
                List<String> m3_list = new ArrayList<>();
                for (int i = 0; i < ms.getGroupmaddr().size(); i++) {
                    Data tsa = new Data();
                    tsa.setTsa(ms.getGroupmaddr().get(i));
                    m3_list.add(parseData(tsa));
                }
                seqOfTsa.put("seq_tsa", m3_list);
                msData = seqOfTsa;
                break;
            case 4:
                Map<String, Object> seqOfLu = new HashMap<>();
                List<String> m4_list = new ArrayList<>();
                for (int i = 0; i < ms.getGroupsetindex().size(); i++) {
                    Data lu = new Data();
                    // 修复：正确处理Unsigned16类型，进行类型转换
                    Unsigned16 unsigned16 = ms.getGroupsetindex().get(i);
                    AxdrUnsigned16 axdrUnsigned16 = new AxdrUnsigned16();
                    axdrUnsigned16.setValue((int) unsigned16.getValue());
                    lu.setLongUnsigned(axdrUnsigned16);
                    m4_list.add(parseData(lu));
                }
                seqOfLu.put("seq_long_unsigned", m4_list);
                msData = seqOfLu;
                break;
            case 5:
                Map<String, Object> seqOfR5 = new HashMap<>();
                List<String> m5_list = new ArrayList<>();
                for (int i = 0; i < ms.getRegiontype().size(); i++) {
                    Data region = new Data();
                    region.setRegion(ms.getRegiontype().get(i));
                    m5_list.add(parseData(region));
                }
                seqOfR5.put("seq_region", m5_list);
                msData = seqOfR5;
                break;
            case 6:
                Map<String, Object> seqOfR6 = new HashMap<>();
                List<String> m6_list = new ArrayList<>();
                for (int i = 0; i < ms.getRegionaddr().size(); i++) {
                    Data region = new Data();
                    region.setRegion(ms.getRegionaddr().get(i));
                    m6_list.add(parseData(region));
                }
                seqOfR6.put("seq_region", m6_list);
                msData = seqOfR6;
                break;
            case 7:
                Map<String, Object> seqOfR7 = new HashMap<>();
                List<String> m7_list = new ArrayList<>();
                for (int i = 0; i < ms.getRegionsetindex().size(); i++) {
                    Data region = new Data();
                    region.setRegion(ms.getRegionsetindex().get(i));
                    m7_list.add(parseData(region));
                }
                seqOfR7.put("seq_region", m7_list);
                msData = seqOfR7;
                break;
        }
        return msData;
    }

    public static Map<String, Object> convertTSMapToJSObj(Map<String, Object> tsMap) {
        return tsMap;
    }
}